智能风控决策引擎系统可落地实现方案(三)模型引擎实现
在之前的文章中,我们实现了规则引擎和决策流,基本完成了风控决策引擎系统的雏形。相关文章请看:
(一)规则引擎实现
(二)决策流实现
大数据风控领域通常根据规则对风险用户进行有效识别并拒绝准入或提高准入门槛,如判断用户信用卡历史逾期记录>5次且逾期总金额>5000元,用户多头共债数大于5,这部分用户风险较大,应该拒绝或进一步人审处理。
而使用规则策略做风控有一定的局限性,依赖人经验,依赖单维特征,可决策结果单一。建立机器学习模型预测用户未来逾期风险(概率),对用户进行分级,可以更灵活给予不同金融产品方案,不同额度、费率、期限方案,进一步提升风控能力。
今天的大数据风控更多采用了规则策略+模型算法结合的方式,本文主要分析模型及其相关系统工程实现。
II.机器学习与模型
1.概念介绍
机器学习主要是依据已有历史数据,挖掘共同特征,用概率统计方法和算法形成机器可识别的规律模式(模型),并用该模式(模型)来预测未知数据。
模型work的重要前提:
具有相同特征的数据具有相同的结果;
历史的数据与未来的数据遵循同样的规律。
2.模型建立
模型的训练,又称学习或拟合fit。这里介绍一个核心公式:
y = f (X)
中学常用的函数公式,一般已知X求y或已知y求X,大学学了导数、微积分就变成了已知X和y求f,机器学习也是如此,通过将X和y数据传入,学习其中潜在的统计学规律,进而求出决策函数f。
f = X->y
2.1 y定义
y 也叫Y标签,因变量。首先我们要根据业务场景理解确定其含义。风控信贷申请流程中,最关注的指标"用户是否逾期",所以会选择用户逾期作为负样本。进一步根据业务场景是单期产品还是分期产品,还款周期长度是多少,如单期14天产品可选择逾期3天作为负样本来定义y标签。
根据训练数据是否有历史表现(Y标签),机器学习又可分为监督学习(已知样本逾期状态),无监督学习(无样本历史结果),半监督学习(部分有部分无),信贷场景更多是监督学习。
2.2 X定义
X 自变量,是多维的向量,也就是我们的特征变量。从一堆结构化+非结构化的数据中,探索并挖掘出有价值的特征变量,这就是常说的特征工程。从数据的探索选择,到数据清洗,特征处理转化,到特征选择评估,特征工程是建模最重要且耗时(且枯燥)的工作。
信贷风控场景中可挖掘数据主要包括:个人基本信息,历史表现,征信及多头表现,行为打点记录,抓取授权信息,以及三方机构数据API服务。数据的质量和特征工程很大程度决定了模型的好坏。
下一步从数据中挖掘出特征,先进行数据清洗,然后加工计算出特征,并对缺失值进行必要的填充。特征变量分为连续型变量(年龄18,19,20...)和离散型变量(学历大专、本科、研究生)。离线型变量也可转为连续数值型,如one-hot编码,woe编码等方法。
最后进行入模特征选择,可以根据iv,缺失率,相关性,稳定性来选择,也可以直接带入模型让模型来筛选。
2.3 样本选择
样本的选择主要看样本量大小,业务初期样本量小可全部选择,甚至加入一些非当前场景下样本填充。样本量大可欠采样处理,优先选择最新数据,选择表现期的样本。
确定样本数据集后,可将数据集分为训练集train,测试集test和时间外样本OOT,先通过训练集进行模型训练,测试集进行模型性能测试,最后通过OOT样本进一步评估模型在最新数据表现。
2.4 建模算法
当预测结果是离散型的,如通过或拒绝,这种建模任务叫分类 Classification(只有两种结果叫二分类,多种叫多分类),如果预测用户可能的逾期风险概率数值,这种任务叫回归Regression,分类与回归问题二者可以互相转换。无监督学习中还有聚类任务。
可选择的模型算法就更多了,常见的有线性回归、逻辑回归、朴素贝叶斯、支持向量机、决策树,以及集成学习算法bagging,stacking,boosting(典型代表GBDT、Adboost、Xgboost)。目前XGBoost由于其优异表现算是风控领域最主流的建模算法了,此外逻辑回归由于良好的可解释性也有广泛应用。
有了样本数据,也定义了X和y,对历史数据计算加工出的X和y作为数据集,然后选择模型算法,进行训练,即可得到相应的模型。算法和模型训练一般有封装好的工具可使用,python作为机器学习领域重要的语言,有非常多的包可使用,如scikit-learn库,TensorFlow库等。
使用sklearn进行模型训练:
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
# Logistic Regression Classifier
classifier = LogisticRegression()
classifier.fit(X,y)
# Decision Tree Classifier
classifier = DecisionTreeClassifier()
classifier.fit(X,y)
# Support Vector Machine Classifier
classifier = SVC()
classifier.fit(X,y)
不同算法得到的模型函数不一样:
(图片来自网络)
产出模型的本质是模型算法以及相应的超参数。
2.5 模型评估
模型的好坏一般看拟合程度,根据拟合程度不同分为过拟合 overfit 或 欠拟合 underfit。
过拟合可能选择了复杂的模型算法或入模特征过多导致模型对训练数据预测非常准,但对新数据预测效果差,泛化能力太差。通俗比喻:模型训练数据只有白猫,当预测时来了只黑猫,就不能识别其是否属于“猫”,模型将“白色”作为权重较大的入模特征。
(图片来自网络)
欠拟合刚好相反,没有提取出关键特征,算法“简单”导致预测能力不足。
模型性能度量指标:混淆矩阵及精准率、召回率,ROC曲线、KS曲线以及稳定性指标PSI。根据模型在测试集和OOT样本的表现评估,来决定模型是否可用,实际模型部署后还要经过一个陪跑的过程才能上线决策。
2.6总结建模流程
3.机器学习平台
将整个机器学习流程工程化实现,通过可视化方式简化建模过程,封装python等代码开发,建立起的平台叫机器学习平台,机器学习平台一般还具备AutoML自动建模的能力。
(图片来自阿里PAI平台)
一些商业化平台产品比较知名的如阿里云PAI,谷歌Cloud AutoML,百度的飞桨更偏向深度学习领域。关于机器学习平台由于目前还处于工程实践中,后面有机会会分享一些实践出来。
III.模型部署与模型引擎
现代建模方法,一般包括Spark、R、Python建模工具。而由于python强大的机器学习库支持,python建模统治建模领域的(大)半壁江山,这里主要介绍python模型部署。
模型训练完,会将模型持久化方便之后直接使用而不用每次都先训练。模型持久化有两种方式pickle和pmml。
pickle是python特有的对象序列化格式,其生成的文件可以保存,发布到生产服务器,由python环境解析执行。
pmml是将模型转化为XML格式的文件,这样python训练出的模型其他语言如java可以解析执行。
生成pickle模型文件
使用python自带pickle包即可轻松实现:
from sklearn import svm
from sklearn import datasets
#training model
clf = svm.SVC()
X, y= datasets.load_iris(return_X_y=True)
clf.fit(X, y)
import pickle
#persistence to pickle file
s = pickle.dumps(clf)
#load pickle file
clf2 = pickle.loads(s)
clf2.predict(X[0:1])
一般常用scikit-learn建模,更推荐使用joblib包来进行dump和load。
from joblib import dump, load
dump(clf, 'filename.joblib')
clf = load('filename.joblib')
生成pmml模型文件
pmml格式对一些深度学习模型支持有限,但像scikit-learn常规建模基本能较好支持,所以很多工程会使用python训练模型,然后导出pmml使用java部署模型(java性能更好些)。
使用sklearn2pmml:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn2pmml import PMMLPipeline, sklearn2pmml
#dataframe
iris = load_iris()
train, test, train_labels, test_labels = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)
#model training
pipeline = PMMLPipeline([
("classifier", tree.DecisionTreeClassifier(random_state=9))
])
pipeline.fit(train, train_labels)
#dump pmml file
sklearn2pmml(pipeline, 'my.pmml', with_repr=True, debug=True)
java代码中需要引入jar包:jpmml-sklearn-executable
参考:https://github.com/jpmml/jpmml-sklearn
模型引擎
模型部署后一般要提供API服务供上游系统调用,来为业务做决策,这种实时模型预测的系统叫模型引擎。其架构如下:
模型工程闭环
整个模型工程包括离线训练和在线预测两部分,离线训练出的模型通过文件导出,发布到模型引擎中,提供模型服务,而实时模型引擎计算出的结果和特征数据又会作为重要的样本数据用于离线分析和离线回溯,形成一个闭环,整体架构如下:
这里通过离线训练建模,然后线上部署实施,一般周期流程较长,几周到月不等。
离线模型服务和实时模型
业务场景不同,也有其他模型架构,一种就是离线训练,离线评估结果,然后再异步推送给业务来做决策,这种适用于对时效性要求不高且数据处理计算量大的场景。
另一种是通过flink等实时计算引擎获取实时数据,在线训练模型并部署决策,但这种实时模型对数据和系统要求较高,且稳定性有争议。
IV.模型引擎与决策引擎打通
有了模型后,风控能力进一步加强,风控系统组合也更加复杂。它是如何与决策引擎结合的呢?
将模型作为特征,决策引擎调用特征引擎,特征引擎调用模型引擎。也可将模型执行嵌入到特征引擎中,但从单一职责角度不推荐。
将模型作为特殊的特征,决策引擎根据标识识别调用特征引擎还是调用模型引擎。之前决策引擎架构不变,在特征获取时进行代码处理。
决策引擎增加一个网络请求网关节点类型,在决策流中配置,执行决策流解析可获取实时请求模型引擎的能力。
决策引擎一般结合模型陪跑以及ABTest进一步观察和评估模型效果后才会正式启用决策。决策引擎拿到模型结果后,可以通过决策矩阵、决策树以及金融产品方案来做进一步风控决策。关于这部分工程实践将在下一篇中展开。
模型领域包罗万象,什么迁移学习,深度学习,知识图谱,社区算法等内容均未覆盖,文中如有纰漏也欢迎指出,欢迎关注并转发我的公众号。